package main

import "fmt"

//如果不用协程，而是用同步代码。也能实现相同的功能。但pow2 tiems2 就不是同时执行了的，而只能是依次执行
//要同时执行，并且又要知道这两个协程什么时候执行完，且到拿执行结果。就必须像本例这样，使用协程和信道。

//计算某个数的平方和
func pow2(num int, ch chan int) {
	sum := 0
	for i := 1; i <= num; i++ {
		sum += i * i
	}
	ch <- sum //将求和结果，保存在信道中
}

//计算某个数的2倍和
func times2(num int, ch chan int) {
	sum := 0
	for i := 1; i <= num; i++ {
		sum += i * 2
	}
	ch <- sum
}

func main() {
	ch1 := make(chan int)
	ch2 := make(chan int)
	num := 30000
	//发起两个协程，同时计算
	go pow2(num, ch1)
	go times2(num, ch2)

	//各自得到计算结果。在读取信道时，会产生阻塞。这个阻塞的目的，可以理解为是在等待两个协程完成各自的任务，然后把结果发送到信道。这里马上就能接收到，阻塞就结束
	re1, re2 := <-ch1, <-ch2
	fmt.Println("每个数的平方和：", re1)
	fmt.Println("每个数的2倍的和：", re2)
	fmt.Println(re1 + re2)
}
